********************************** * * * SAVER.ASM Source Code * * by Thomas Dorris * * * * Copyright (c) 1990 * * MindCraft Publ. Corp. * * Concord, MA 01742 * * Orca/M Assembler * ********************************** MCOPY SAVER.MAC KEEP SAVER * * Global equates * keep 'rampatch' org $9c00 COL80CLR GEQU $E1C00C ;Sets 40 column mode OS_ID GEQU $E100BC ;1 for ProDOS 16 SCREEN GEQU $E12000 ;Super Hires screen BANK0 GEQU $000C00 ;Start Bank0 program MAIN START * * Initial data for a Classic Desk Accessory * STR 'Screen Saver' ;Title of CDA DC I4'SSSTART' ;starting code DC I4'SSEND' ;shutdown code * * * Main code block * * SSSTART PHK PLB ;Set data bank SEP #$20 STA COL80CLR REP #$30 LDA #TITLE JSR DISPLAY ;Clear screen JSR GETLINE ;Input name of file AND #$00FF ;Acc contains length BEQ SSEND ;If length=0, exit LDA #$A3 ;Display screen STA $E1C029 JSR CHCKID BEQ PRO16 JSR DOPRO8 BNE ERROR BRA CLS2 PRO16 DESTROY CREATEPARM ;Close and delete file BCC CRT CMP #$46 BNE ERROR CRT CREATE CREATEPARM ;Create new file BCS ERROR OPEN OPENPARM BCS ERROR LDA OPENPARM ;Save reference number STA WRITEPARM WRITE WRITEPARM ;Write screen data to disk BCS ERROR CLS CLOSE OPENPARM ;Close and return CLS2 JSR DSPOFF SSEND RTL * * * Error code. Displays error message and exits * * ERROR PHA JSR DSPOFF ;Set text mode LDA #ERRMSG JSR DISPLAY ;print error message PLA SEP #$20 LONGA OFF PHA AND #$F TAX LDA LST,X ORA #$80 STA $E0053A PLA LSR A LSR A LSR A LSR A TAX LDA LST,X ORA #$80 STA $E00539 REP #$30 LONGA ON WT LDA $E1BFFF ;Get key BPL WT STA $E1C010 JSR CHCKID BNE CLS2 BRA CLS ;Close if opened and exit LST ASC '0123456789ABCDEF' DSPOFF LDA #$1 ;Go to text mode STA $E1C029 RTS CHCKID LDA OS_ID AND #$00FF CMP #$1 RTS * * * Clears screen and displays message block * * DISPLAY LDX #$3FE STA LOADADR+1 STA LDADR1+1 LDA #$A0A0 CLEAR STA $E00400,X ;Store space DEX DEX BPL CLEAR LDY #$FFFE INCRY INY INY LOADADR LDX TITLE,Y ;Get screen address BEQ DISPDONE ;If zero, end of data INCRX INY INY LDADR1 LDA TITLE,Y ;Get character BEQ INCRY ;If zero, get next line ORA #$8080 STA $E00400,X INX INX BRA INCRX DISPDONE RTS * * * Input line. Ignores all but alphanumeric keys * * GETLINE LDA #NAME-STRT8+START8 ;location of P8 path STA ZPG2+1 INC A STA ZPG1+1 SEP #$20 ;8-bit accumulator mode LONGA OFF GETKEY1 LDX #0 GETKEY LDA #$2E STA $E00528,X JSR WAIT ;Get key and mask AND #$7F CMP #$60 ;Convert to upper case BCC UPPER EOR #$20 UPPER CMP #$8 BNE NTBKSP BKSP LDA #$AE ;delete cursor STA $E00528,X DEX ;Decrease counter BPL GETKEY BMI GETKEY1 NTBKSP CMP #$5F ;If delete, do backspace BEQ BKSP CMP #$20 ;If SPACE,screen display BEQ SCNDIS CMP #$1B ;If ESC, exit BEQ ESC CMP #$0D ;If return, done BEQ KEYDONE CMP #$2E BCC GETKEY ;Check for period and slash CMP #$3A BCC KEYOK CMP #$41 ;Check for alpha-keys BCC GETKEY CMP #$5B BCS GETKEY KEYOK STA BUF+1,X ;Store key in buffer (P16) ZPG1 STA NAME+1,X ;Store key in buffer (P8) ORA #$80 STA $E00528,X ;Display on screen CPX #38 BEQ GETKEY INX BRA GETKEY SCNDIS LDA #$A3 STA $E1C029 JSR WAIT LDA #1 STA $E1C029 BRA GETKEY ESC LDX #0 KEYDONE TXA STA BUF ZPG2 STA NAME REP #$30 LONGA ON RTS WAIT LDA $E1C000 BPL WAIT STA $E1C010 RTS * * * Swap bank 0, execute, & swap back * * DOPRO8 JSR SWAP ;Swap in Bank0 code JSL BANK0 ;Execute PHA JSR SWAP ;Replace original data PLA RTS SWAP LDX #END8-START8-2 ;length of Bank0 code SWAP1 LDA START8,X PHA DC I1'$BF,0,8,0' ;=LDA BANK0,X STA START8,X PLA DC I1'$9F,0,8,0' ;=STA BANK0,X DEX DEX BPL SWAP1 RTS * * * Title screen data * * TITLE DC I2'$00B' ASC 'Nibble Screen Saver ' DC I2'0' DC I2'$08E' ASC 'Thomas Dorris ' DC I2'0' DC I2'$380' ASC 'Enter name to save screen as: ' DC I2'0' DC I2'$028' ASC 'Include prefix and subdirectory ' DC I2'0' DC I2'$128' ASC '....................................... ' DC I2'0' DC I2'$3A8' ASC 'Press [SPACE] to view screen' DC I2'0' DC I2'$0D0' ASC 'Press [ESC] to abort to accessories ' DC I2'0' DC I2'0' * * * Error message data * * ERRMSG DC I2'$12D' ASC 'Error code $ has occurred!' DC I2'0' DC I2'$2AD' ASC 'Press any key to abort' DC I2'0' DC I2'0' * * * ProDOS information * * BUF DS 40 ;File name HNDL DC I4'START8' OPENPARM DS 2 ;Room for reference # DC I4'BUF' ;Filename pointer DC I4'HNDL' ;IO buffer handle CREATEPARM DC I4'BUF' ;Filename DC I2'$C3' ;Access type DC I2'$C1' ;File type DC I4'0' ;Aux type DC I2'1' ;Storage type DC I4'0' ;Date stuff WRITEPARM DS 2 ;number location DC I4'SCREEN' ;super hires screen DC I4'32768' ;Length of screen data DC I4'0' ;Room for amount written START8 ANOP * * * ProDOS 8 equates * * MLI EQU $BF00 ;ProDOS 8 MLI call BITMAP EQU $BF58 ;areas available for ProDOS MLIACT EQU $BF9B ;Bit 7 tells if active ZPAGE EQU $FA ;Used as pointer CCREATE EQU $C0 CDESTROY EQU $C1 COPEN EQU $C8 CWRITE EQU $CB CCLOSE EQU $CC * * * ProDOS 8 main routine * * OBJ $800 STRT8 ANOP OPNBUF DS 1024 PHD ;Save direct page PEA $0000 PLD PHB PHK PLB LDA ZPAGE ;Save zero page usage PHA LDA ZPAGE+2 PHA LDA #SCREEN ;Set up pointer to screen STA ZPAGE LDA #^SCREEN STA ZPAGE+2 LONGA OFF LONGI OFF SEC XCE SEP #$20 LDA BITMAP+1 STA MAPBYTE STZ BITMAP+1 JSR MLI ;Destroy file DC I1'CDESTROY' DC I2'DESTPARM8' BEQ DESTOK CMP #$46 ;FILE NOT FOUND BNE EXIT DESTOK JSR MLI ;Create file DC I1'CCREATE' DC I2'CREATEPARM8' BNE EXIT JSR MLI ;Open file DC I1'COPEN' DC I2'OPENPARM8' BNE EXIT LDA OPENREF STA WRITEREF STA CLSREF MOVEMORE LDY #0 MOVE LDA [ZPAGE],Y STA WRTBUF,Y NOINC INY BNE MOVE INC ZPAGE+1 JSR MLI ;Write next segment DC I1'CWRITE' DC I2'WRITEPARM8' BNE EXIT LDA ZPAGE+1 CMP #$A0 BNE MOVEMORE LDA #0 ;Load Acc with no error EXIT STA ERROR8 JSR MLI DC I1'CCLOSE' DC I2'CLOSEPARM8' LDA MAPBYTE ;Restore original bitmap STA BITMAP+1 LONGA ON LONGI ON CLC XCE REP #$30 PLA STA ZPAGE+2 PLA STA ZPAGE LDA ERROR8 AND #$00FF PLB PLD RTL * * * ProDOS 8 parms * * WRTBUF DS 256 ERROR8 DS 1 MAPBYTE DS 1 NAME DS 40 DESTPARM8 DC I1'1' DC I2'NAME' CREATEPARM8 DC I1'7' DC I2'NAME' DC I1'$C3' DC I1'$C1' DC I2'0' DC I1'1' DC I2'0' DC I2'0' OPENPARM8 DC I1'3' DC I2'NAME' DC I2'OPNBUF' OPENREF DC I1'1' WRITEPARM8 DC I1'4' WRITEREF DC I1'1' DC I2'WRTBUF' DC I2'256' DC I2'0' CLOSEPARM8 DC I1'1' CLSREF DC I1'1' OBJEND END8 ANOP END